/* Copyright (c) 2011 Alexandre Défossez
 * This file is part of HINAPT.
 *
 * HINAPT is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * HINAPT is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HINAPT.  If not, see <http://www.gnu.org/licenses/>.
 */
 /*!
  \file ElasticModel.hpp
  Modèle d'une liaison élastique avec frottement fluide en régime critique.
  Utilisé pour lisser les déplacements.
 */

#ifndef ELASTICMODEL_HPP
#define ELASTICMODEL_HPP

#include "_tracker.hpp"

/*!
  Permet d'obtenir la position et la vitesse d'un objet lié élastiquement
  à un point de l'espace, en régime critique (Q = 1/2).
*/
class ElasticModel
{
  public:
    ElasticModel();
    /*!
     Permet de définir les conditions initiales.
     \param currentPos position actuelle du point
     \param dest destination du point, i.e, le point où est accroché l'élastique
     \param Vi vitesse initiale du point
     \param tau temps caractéristique
    */
    void init(Point3d currentPos, Point3d dest, Vec3d Vi,
                 double tau=0.01);
    /*!
      \return La position actuelle du point
    */
    Point3d getPosition();
    /*!
      \return la vitesse actuelle du point
    */
    Vec3d getSpeed();
  protected:
  private:
    /*!
      Temps initial
    */
    double beginT;
    /*!
      Temps caractéristique
    */
    double tau;
    /*!
      Coefficiants du mouvement
    */
    Vec3d A;
    /*!
      Coefficiants du mouvement
    */
    Vec3d B;
    /*!
      Point d'attache de l'élastique
    */
    Point3d dest;

};

#endif // ELASTICMODEL_HPP
